函数声明
函数定义
函数调用
函数调用时,要先有定义,如果是多文档,当函数越来越多时,要保证顺序就很难了。所以引入了函数声明的概念,当一个函数被声明后,它就可以被直接调用,而不一定要把函数定义也放在前面,这就解决了函数调用顺序的问题。通常把各个函数的声明写在前面,然后函数定义就不要保证顺序了。
程序可以分解成若干个函数,来分别实现不同的功能。
如何组织一个程序?C的设计原则是把函数作为程序的构成模块,可以省出重复代码的编写,便于阅读。
某些函数会导致执行某些动作,如printf()可使数据呈现在屏幕上,还有一些函数如strlen()能返回一个值,以供程序使用。
一个C程序可由一个主函数和若干个其他函数构成。一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完成。
函数间的调用关系:由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。
所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是系统调用的。
从用户使用的角度看,函数有两种:
① 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。不同的C系统提供的库函数的数量和功能会有一些不同,但许多基本的函数是共同的。
② 用户自己定义的函数。用以解决用户的专门需要。
从函数的形式看,函数分两类:
①无参函数。无参函数一般用来执行指定的一组操作。在调用无参函数时,主调函数不向被调用函数传递数据。
②有参函数。主调函数在调用被调用函数时,通过参数向被调用函数传递数据。
定义无参函数的一般形式为:
类型标识符 函数名()
{
声明部分
语句部分
}
主调函数调用空函数时,只表明这里要调用一个函数,但函数本身什么工作也不做等,以后扩充函数功能时补充上。
主调函数和被调用函数之间有数据传递的关系。在不同的函数之间传递数据,可以使用的方法有:
◆参数:通过形式参数和实际参数
◆返回值:用return语句返回计算结果
◆全局变量:外部变量
(1) 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
(2) 实参可以是常量、变量或表达式,
如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。
如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。
按函数在程序中出现的位置来分,可以有以下三种函数调用方式:
1.函数语句
把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作。
2.函数表达式
函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);
3.函数参数
函数调用作为一个函数的实参。
例如: m = max (a , max ( b , c ) ) ;
其中max ( b , c )是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者中的最大者。
在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢
1.首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。
2.如果使用库函数,还应该在本文件开头用#include 命令将调用有关库函数时所需用到的信息“包含”到本文件中来。
3.如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明。
函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。
嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义 。
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。
用数组名作函数参数时,此时形参应当用数组名或用指针变量 。
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。即
static 类型标识符函数名(形参表)
例如:static int fun ( int a , int b )
定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。例如,函数首部可以写为extern int fun (int a, int b),这样,函数fun就可以为其他文件调用。如果在定义函数时省略extern,则隐含为外部函数。
在定义函数中指定的形参,在未出现函数调用之前,它们并不占用内存中的存储单元,只有在发生函数调用时,函数max中的形参才被分配内存单元,在调用结束后,形参所占用的内存单元也被释放;
凡不加类型说明的函数,自动按整形处理;
实参求值的顺序,因为实参可以包含表达式,如果多个实参的表达式都有包含相同变量名则求值的顺序会影响到函数的执行绪过程;
如funcEx(i,++i)
函数调用的方式:
1 函数语句:把函数调用作为一个语句,这时不要求函数带返回值,只要求函数完成一定的操作;
2 函数表达式:函数出现在表达式中;
3 函数参数;